#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 7;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int n,m, f;
int p[N], sz[N], q[N], u, k, top; // top表示当前遍历到的第几个点
vector<int> g[N];
void dfs(int u)
{
	sz[u] = 1;//存储每个节点子树的节点数
	q[top] = u; // 将当前访问的节点u添加到队列q中，位置为top
	p[u] = top; // 记录节点u在队列q中的位置，p[]数组用于存储每个节点的位置信息。
	top++;
	for (auto v : g[u])//遍历与节点u相邻的所有节点v（即u的邻接节点），g[u]表示节点u的所有邻居集合
	{
		dfs(v);
		sz[u] += sz[v];//在返回到节点u时，将子节点v的子树大小加到u的子树大小上，以计算以u为根的子树总大小。
	}
}
int main()
{
	cin >> n >> m;
	for (int i = 2; i <= n; i++)
	{
		cin >> f; // t表示第i号节点的父节点的编号
		g[f].push_back(i);
	}
	for (int i = 1; i <= n; i++)
		sort(g[i].begin(), g[i].end());
	dfs(1);
	while (m--)
	{
		int u, k;
		cin >> u >> k;
		if (k > sz[u])
			puts("-1");
		else
			cout << q[p[u] + k - 1] << endl;
	}
	return 0;
}
